In [1]:
import pandas as pd
import numpy as np
import yfinance as yf
import random
from matplotlib import pyplot as plt
import seaborn as sns
import warnings
import secrets
import plotly as plotly
import plotly.express as px
from tqdm import tqdm
import plotly.graph_objects as go
pd.set_option('plotting.backend', 'matplotlib')
plotly.offline.init_notebook_mode()
#warnings.simplefilter(action='ignore', category=FutureWarning)
PORTFOLIO ONLY IWDA
In [2]:
TICKER="IWDA.AS"
NUMBER_OF_SIMULATIONS=1000
STARTING_CAPITAL = 10000
YEARS_OF_SIMULATION=30
In [3]:
YEARS_OF_SIMULATION=YEARS_OF_SIMULATION+1
Market_Days=253
df=yf.download(TICKER)["Adj Close"].pct_change(1).dropna()
[*********************100%%**********************] 1 of 1 completed
In [4]:
df.plot()
Out[4]:
<Axes: xlabel='Date'>
In [5]:
df
Out[5]:
Date
2009-09-28 0.000000
2009-09-29 0.000000
2009-09-30 0.000000
2009-10-01 0.000000
2009-10-02 0.000000
...
2023-11-13 0.007003
2023-11-14 0.006568
2023-11-15 0.003582
2023-11-16 -0.005737
2023-11-17 0.003590
Name: Adj Close, Length: 3624, dtype: float64
In [6]:
df_simulations=np.zeros((YEARS_OF_SIMULATION,NUMBER_OF_SIMULATIONS))
df_simulations[0,:]=STARTING_CAPITAL
for x in tqdm(range(0,NUMBER_OF_SIMULATIONS)):
for i in range(1,YEARS_OF_SIMULATION):
annual_change=1
for k in range(Market_Days):
annual_change=annual_change*(1+(secrets.choice(df.iloc[:])))
df_simulations[i,x]=annual_change*df_simulations[i-1,x]
df_simulations= pd.DataFrame(df_simulations)
df_simulations_1= pd.DataFrame(df_simulations)
0%| | 0/1000 [00:00<?, ?it/s]C:\Users\dadoi\anaconda3\Lib\random.py:374: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]` 100%|██████████| 1000/1000 [03:26<00:00, 4.85it/s]
In [7]:
df_simulations_1
Out[7]:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | ... | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 10000.000000 | 1.000000e+04 | 10000.000000 |
| 1 | 10070.354392 | 8682.127497 | 13523.052287 | 7591.196312 | 12468.430364 | 13015.263691 | 11557.535587 | 12276.561658 | 11713.033302 | 8461.744842 | ... | 9333.955410 | 11076.665088 | 10873.466957 | 10453.252583 | 12291.354000 | 10056.151617 | 11008.934831 | 11017.467306 | 1.116024e+04 | 11146.980364 |
| 2 | 9412.933449 | 10072.868267 | 12482.186037 | 7249.872447 | 13257.488266 | 15079.337808 | 14363.861619 | 11577.543553 | 12895.309686 | 8031.585095 | ... | 9304.173739 | 13079.512415 | 9439.335214 | 12702.705704 | 15091.412060 | 10584.225239 | 11396.841040 | 13117.129564 | 1.401999e+04 | 11029.214270 |
| 3 | 10109.339562 | 9944.894193 | 13515.929291 | 9175.127474 | 14596.936624 | 19402.906121 | 16470.849055 | 11997.620639 | 14944.332431 | 10657.215890 | ... | 9382.075262 | 16976.749969 | 12516.169298 | 17963.592871 | 19746.902322 | 14428.349244 | 11471.973089 | 14848.461212 | 1.795668e+04 | 12257.667369 |
| 4 | 11717.157020 | 8969.493466 | 16364.226117 | 12148.035050 | 12759.710626 | 25248.863594 | 15750.828825 | 17562.336437 | 12126.707456 | 13796.836815 | ... | 9685.116994 | 20439.959811 | 17971.622237 | 21279.268671 | 28545.467602 | 21242.847240 | 14323.394123 | 16593.214463 | 1.512262e+04 | 12787.585755 |
| 5 | 14130.235314 | 11855.257437 | 17914.600059 | 12309.897777 | 18794.025692 | 33947.883363 | 18596.283990 | 16602.135026 | 14773.965227 | 18895.113761 | ... | 9607.392149 | 25308.886399 | 19139.042018 | 21490.787568 | 26458.637009 | 27136.957205 | 16407.050803 | 16837.458128 | 1.791887e+04 | 10380.377780 |
| 6 | 12075.108179 | 13458.192506 | 27090.035268 | 12513.526706 | 14171.593382 | 32320.265359 | 22686.440620 | 17955.397907 | 14330.228205 | 28651.322464 | ... | 10361.785394 | 36318.453085 | 23311.404703 | 27040.991051 | 21232.145408 | 30395.856185 | 19883.787719 | 21322.358005 | 1.982593e+04 | 10978.647701 |
| 7 | 16641.342845 | 15620.674776 | 19879.915337 | 15263.256396 | 20511.242011 | 35278.743409 | 24750.671258 | 20226.349890 | 15834.868207 | 27033.976730 | ... | 9073.055322 | 40180.083266 | 23324.241084 | 32022.268300 | 18882.879537 | 28098.738237 | 19430.832831 | 27733.639048 | 2.076939e+04 | 16314.406606 |
| 8 | 14928.233503 | 16545.117956 | 26164.272934 | 17942.106516 | 19715.744128 | 33603.242552 | 30325.666847 | 20352.174371 | 13475.968643 | 32846.722029 | ... | 9079.173417 | 43014.278059 | 28622.037024 | 36567.444112 | 21183.865282 | 27546.286495 | 22551.346133 | 33369.601335 | 2.366700e+04 | 16148.756594 |
| 9 | 16554.260428 | 16568.671330 | 38780.186618 | 18711.512285 | 23523.462997 | 32228.852905 | 36249.229732 | 22115.712468 | 16418.292591 | 46595.596687 | ... | 10077.107160 | 57779.358498 | 36013.015277 | 34361.592594 | 21924.211345 | 28173.462666 | 24379.808379 | 32064.014193 | 3.151071e+04 | 21678.661551 |
| 10 | 15510.016601 | 14569.968393 | 37854.775727 | 19542.987328 | 27807.732551 | 39623.154088 | 39454.699226 | 21031.772192 | 27378.739056 | 42438.316581 | ... | 10586.195064 | 79272.314723 | 48618.072434 | 37811.166224 | 19741.825586 | 28371.714545 | 31322.039449 | 31817.865698 | 4.389916e+04 | 24206.454391 |
| 11 | 19828.781013 | 11827.054494 | 31329.985123 | 22984.297110 | 30458.213490 | 45838.718155 | 39875.413713 | 19586.704707 | 28783.591309 | 42402.762360 | ... | 10029.016208 | 112646.216946 | 57769.920304 | 45128.460892 | 24478.349568 | 30477.989747 | 33076.156913 | 32294.587466 | 5.312072e+04 | 18466.980090 |
| 12 | 23570.291988 | 13672.165741 | 45159.559146 | 27979.093865 | 37162.121671 | 58605.056470 | 38746.961932 | 19756.673834 | 23906.147970 | 48934.404160 | ... | 12081.500642 | 123547.231999 | 81883.581707 | 40600.790672 | 26656.916116 | 27072.624518 | 38283.869367 | 27083.815015 | 7.036555e+04 | 21049.343862 |
| 13 | 22880.244218 | 12920.708323 | 42910.416571 | 23423.736096 | 42213.309647 | 80302.398317 | 42623.574557 | 25226.131821 | 27365.831394 | 54569.513619 | ... | 19146.976636 | 139819.089623 | 94942.314473 | 39726.687218 | 42505.890730 | 36852.022741 | 47528.879869 | 31333.596278 | 1.114560e+05 | 24756.594270 |
| 14 | 24491.170258 | 13351.821752 | 42869.225776 | 30463.407479 | 46285.173844 | 103018.009560 | 44163.977216 | 32332.116506 | 30075.589337 | 60693.489431 | ... | 16144.821576 | 151292.973359 | 112844.528261 | 36118.523980 | 46863.104998 | 37239.092890 | 50986.367937 | 33476.041781 | 1.035880e+05 | 27235.067222 |
| 15 | 23717.299039 | 13885.068083 | 38274.595145 | 36031.315107 | 59920.182182 | 105124.308847 | 50533.090672 | 35611.302497 | 29713.841186 | 74049.488679 | ... | 22210.662245 | 184831.560552 | 100936.523044 | 38045.406839 | 46154.247465 | 36340.891736 | 61533.788907 | 31870.337784 | 1.207622e+05 | 26509.710454 |
| 16 | 22903.556880 | 20656.846666 | 62293.331427 | 32992.783702 | 81219.518645 | 106482.843214 | 45354.888740 | 36319.416015 | 35535.285690 | 58204.752597 | ... | 27377.274661 | 168873.464964 | 114243.686248 | 33940.693865 | 47041.664340 | 37054.892075 | 70248.198358 | 45983.544527 | 1.312317e+05 | 22313.960909 |
| 17 | 21521.568161 | 25653.790065 | 62396.968205 | 42136.419894 | 92474.689174 | 107647.319846 | 48523.784323 | 34115.358994 | 35670.911524 | 65290.882499 | ... | 27775.686814 | 163959.381278 | 125633.635450 | 40484.497539 | 59056.320470 | 45604.603910 | 91124.209459 | 48842.426542 | 1.625908e+05 | 20434.889156 |
| 18 | 26984.409021 | 33388.374644 | 66549.802772 | 39128.876324 | 96588.971077 | 118639.190315 | 57037.268844 | 33076.920374 | 53855.452018 | 84761.397197 | ... | 34659.002995 | 202204.251165 | 123587.657377 | 42221.672466 | 59253.400601 | 41743.545137 | 86085.515875 | 49598.556920 | 2.441315e+05 | 26872.212466 |
| 19 | 32572.289995 | 31851.548795 | 68548.090517 | 43024.704740 | 109456.767500 | 145731.916173 | 72284.713902 | 32229.915424 | 50010.410565 | 77405.854045 | ... | 35845.844076 | 231907.175847 | 125059.566739 | 35765.647342 | 63624.712637 | 40156.367185 | 119065.403279 | 48519.461266 | 1.677412e+05 | 35929.521911 |
| 20 | 39121.004987 | 40258.727531 | 68384.025368 | 36640.119516 | 116676.929902 | 172204.746138 | 68987.191438 | 32206.056794 | 62261.526125 | 78168.875937 | ... | 31175.338441 | 207540.577105 | 205356.605946 | 40987.421313 | 84497.103290 | 38604.219957 | 131916.439864 | 42296.800104 | 1.874008e+05 | 32298.275500 |
| 21 | 45110.185244 | 47974.643832 | 70658.886199 | 36911.789298 | 104735.084121 | 163750.066648 | 70054.341827 | 38453.358120 | 63134.044112 | 83375.926012 | ... | 34506.382140 | 209923.620162 | 219164.553972 | 44926.949117 | 86968.939162 | 48493.306398 | 157506.366832 | 50539.921657 | 2.239283e+05 | 30274.618709 |
| 22 | 56654.696280 | 72235.139886 | 105053.722647 | 53919.236126 | 103936.973691 | 191638.185828 | 72315.092254 | 36519.640957 | 76934.239157 | 92012.095177 | ... | 51095.558040 | 195467.731949 | 205590.081163 | 67664.845094 | 96963.364595 | 44491.968222 | 171271.656722 | 49041.809921 | 3.286572e+05 | 36439.387737 |
| 23 | 63389.138049 | 65591.938942 | 110372.152219 | 60116.117828 | 113178.435009 | 291073.562288 | 86192.287882 | 37110.190855 | 62510.126903 | 102660.548087 | ... | 46673.303922 | 254111.326806 | 260356.956684 | 106432.066729 | 105026.694509 | 56920.134950 | 174607.516521 | 53160.565610 | 3.450173e+05 | 31605.959343 |
| 24 | 55074.350085 | 75218.763780 | 155339.277989 | 77607.496583 | 93664.575432 | 335017.460676 | 96568.815057 | 43566.345116 | 59671.614343 | 112135.944263 | ... | 49977.703508 | 347591.720639 | 291453.260751 | 120889.088655 | 129427.262908 | 65865.455653 | 151609.363979 | 65566.940697 | 3.390865e+05 | 38582.319652 |
| 25 | 44379.425907 | 77470.638208 | 138297.289131 | 100455.655414 | 101109.665749 | 352149.248122 | 101504.626810 | 49819.354990 | 53124.469910 | 139980.595823 | ... | 49921.471071 | 471570.416391 | 275239.860118 | 155993.859121 | 110547.789987 | 90866.373460 | 162874.820468 | 83281.993182 | 2.876401e+05 | 29606.593096 |
| 26 | 48404.946267 | 75196.676412 | 205766.612646 | 125948.345928 | 121452.294188 | 440712.110344 | 149293.336706 | 73063.167194 | 51413.929996 | 147154.065714 | ... | 54192.093711 | 492681.447548 | 338186.205158 | 217427.269024 | 113027.635657 | 107511.968350 | 168921.254563 | 74926.301424 | 3.300912e+05 | 31885.678573 |
| 27 | 60209.818206 | 92740.798336 | 244874.178859 | 116068.106202 | 139780.602256 | 579726.729709 | 161826.954168 | 78765.162799 | 45058.344285 | 141120.614129 | ... | 61722.892614 | 488301.578369 | 395140.193375 | 256490.058821 | 131266.996446 | 126369.891540 | 158897.022424 | 106318.001638 | 4.913907e+05 | 37581.916255 |
| 28 | 85640.133059 | 100558.472188 | 276415.639881 | 178571.439721 | 167289.865431 | 542733.137023 | 170403.605438 | 84471.246306 | 40889.491610 | 172796.677980 | ... | 65846.841951 | 455100.282852 | 438719.131847 | 308574.881800 | 173254.300746 | 165839.880376 | 173105.532059 | 89561.252482 | 6.316132e+05 | 38156.971694 |
| 29 | 87303.459701 | 103291.635045 | 247429.087592 | 221626.889370 | 156269.112085 | 534945.956694 | 211877.239170 | 92039.620290 | 37674.179378 | 187395.730941 | ... | 65047.355392 | 567716.722974 | 466756.223277 | 399002.864547 | 184699.889027 | 202084.081517 | 208547.880858 | 75012.539989 | 8.596206e+05 | 43589.121470 |
| 30 | 83525.802929 | 117838.824118 | 383139.173647 | 176534.042073 | 181964.046304 | 677754.676304 | 242301.816691 | 91212.174739 | 48991.574417 | 200332.305337 | ... | 70582.669241 | 542625.368655 | 462161.895679 | 474753.858827 | 176720.519634 | 228328.330113 | 229188.180885 | 103677.308001 | 1.046329e+06 | 47765.934421 |
31 rows × 1000 columns
In [8]:
df_simulations=df_simulations_1
df_simulations.iloc[YEARS_OF_SIMULATION-1]
Out[8]:
0 8.352580e+04
1 1.178388e+05
2 3.831392e+05
3 1.765340e+05
4 1.819640e+05
...
995 2.283283e+05
996 2.291882e+05
997 1.036773e+05
998 1.046329e+06
999 4.776593e+04
Name: 30, Length: 1000, dtype: float64
In [9]:
quantile=df_simulations.iloc[YEARS_OF_SIMULATION-1].quantile([0.1,0.9])
quantile=list(quantile)
print(quantile)
df_simulations_purged=df_simulations[df_simulations.columns[ df_simulations.max() < quantile[1]]]
df_simulations_purged=df_simulations_purged[df_simulations_purged.columns[ df_simulations_purged.max() > quantile[0]]]
[77447.84532902476, 743787.8775983766]
In [10]:
df_simulations_purged.plot(figsize=(16,8), title=f"Simulation of {NUMBER_OF_SIMULATIONS} portfolios", legend=False)
Out[10]:
<Axes: title={'center': 'Simulation of 1000 portfolios'}>
In [11]:
df_simulations_purged.iloc[YEARS_OF_SIMULATION-1].plot.density(figsize=(16,8),fontsize=14, xlim=(-100000,900000))
Out[11]:
<Axes: ylabel='Density'>
In [12]:
top_25 =[]
low_25 =[]
median=[]
for i in range(0,YEARS_OF_SIMULATION):
top_25.append(df_simulations.iloc[i].quantile(0.75))
low_25.append(df_simulations.iloc[i].quantile(0.25))
median.append(df_simulations.iloc[i].median())
columns=["top 25%","median","bottom 25%"]
df_statistics=pd.DataFrame(list(zip(top_25,median,low_25)),columns=columns)
df_statistics
Out[12]:
| top 25% | median | bottom 25% | |
|---|---|---|---|
| 0 | 10000.000000 | 10000.000000 | 10000.000000 |
| 1 | 12300.068432 | 11192.206666 | 9996.354059 |
| 2 | 14336.514808 | 12458.575130 | 10590.434376 |
| 3 | 16610.288396 | 13673.808139 | 11448.636500 |
| 4 | 18880.224755 | 15235.844686 | 12275.881294 |
| 5 | 21268.548352 | 16847.744814 | 13104.444773 |
| 6 | 24227.432634 | 18938.948964 | 14295.689847 |
| 7 | 28309.627956 | 20525.367290 | 15731.353013 |
| 8 | 32458.360955 | 23276.307390 | 16845.537477 |
| 9 | 36028.156546 | 25629.098809 | 18732.028490 |
| 10 | 40742.400011 | 28326.933079 | 20271.160010 |
| 11 | 45823.297530 | 31436.691970 | 22479.034417 |
| 12 | 52140.702051 | 35368.912631 | 24832.401173 |
| 13 | 58912.698081 | 39071.737003 | 27360.383405 |
| 14 | 66291.311819 | 44200.762285 | 30142.757603 |
| 15 | 73921.752918 | 48891.111519 | 32617.537553 |
| 16 | 85771.487814 | 55322.310246 | 35988.741348 |
| 17 | 93644.214511 | 61710.280900 | 38834.410599 |
| 18 | 108241.629592 | 69872.959802 | 42278.925271 |
| 19 | 122252.561920 | 77205.201100 | 46344.975129 |
| 20 | 140338.720955 | 86017.331219 | 50433.976843 |
| 21 | 159346.394715 | 94391.565536 | 57759.554918 |
| 22 | 183031.760801 | 105896.249972 | 62382.925298 |
| 23 | 206737.578813 | 117428.956925 | 68007.459915 |
| 24 | 227780.355225 | 129631.788433 | 74507.749867 |
| 25 | 258493.177545 | 143622.617795 | 81348.865066 |
| 26 | 286254.812126 | 157461.844804 | 90279.066427 |
| 27 | 324224.800046 | 172669.726129 | 99899.449433 |
| 28 | 367943.173037 | 192592.635302 | 108520.484803 |
| 29 | 412179.292166 | 214589.233102 | 122191.873320 |
| 30 | 467627.745574 | 240722.507959 | 133437.337804 |
In [13]:
#ax= df_statistics.plot(legend=None,logy=False,fontsize=20,figsize=(25,15),linewidth=4,color="black",title=f"Simulation of {NUMBER_OF_SIMULATIONS} portfolios")
pd.set_option('plotting.backend', 'plotly')
fig = df_statistics.plot(width=1600, height=800,title=f"Simulation of {NUMBER_OF_SIMULATIONS} portfolios",labels= {"index": "Years to Maturity", "value":"Total Capital"} )
fig.add_trace(go.Scatter(x=list(range(0,YEARS_OF_SIMULATION)),y=np.array(top_25),fill='tonexty',mode='lines', line_color='blue' , fillcolor ="red", showlegend=False, hoverinfo="skip"))
fig.add_trace(go.Scatter(x=list(range(0,YEARS_OF_SIMULATION)),y=np.array(median),fill='tonexty',mode='lines', line_color='orange', fillcolor="green", showlegend=False, hoverinfo="skip"))
In [14]:
ls_simulations_at_profit=[]
for i in range(YEARS_OF_SIMULATION):
c=len([1 for i in list(df_simulations.iloc[i])if i > STARTING_CAPITAL])
ls_simulations_at_profit.append(c/NUMBER_OF_SIMULATIONS*100)
pd.set_option('plotting.backend', 'plotly')
df_simulations_at_profit = pd.DataFrame(ls_simulations_at_profit,columns=["Profit %"])
df_simulations_at_profit.plot(title="Minimum investment horizon", labels= {"index": "Period length in years", "value":"Chance to be in profit"})
In [14]:
In [14]:
In [15]:
TICKER="^GSPC"
In [16]:
df=yf.download(TICKER)["Adj Close"].pct_change(1).dropna()
df_simulations = np.zeros((YEARS_OF_SIMULATION, NUMBER_OF_SIMULATIONS))
df_simulations[0, :] = STARTING_CAPITAL
for x in tqdm(range(0, NUMBER_OF_SIMULATIONS)):
for i in range(1, YEARS_OF_SIMULATION):
annual_change = 1
for k in range(Market_Days):
annual_change = annual_change * (1 + (secrets.choice(df.iloc[:])))
df_simulations[i, x] = annual_change * df_simulations[i - 1, x]
df_simulations = pd.DataFrame(df_simulations)
df_simulations_1 = pd.DataFrame(df_simulations)
df_simulations = df_simulations_1
df_simulations.iloc[YEARS_OF_SIMULATION - 1]
quantile = df_simulations.iloc[YEARS_OF_SIMULATION - 1].quantile([0.1, 0.9])
quantile = list(quantile)
df_simulations_purged = df_simulations[df_simulations.columns[df_simulations.max() < quantile[1]]]
df_simulations_purged = df_simulations_purged[df_simulations_purged.columns[df_simulations_purged.max() > quantile[0]]]
top_25 =[]
low_25 =[]
median=[]
for i in range(0,YEARS_OF_SIMULATION):
top_25.append(df_simulations.iloc[i].quantile(0.75))
low_25.append(df_simulations.iloc[i].quantile(0.25))
median.append(df_simulations.iloc[i].median())
columns=["top 25%","median","bottom 25%"]
df_statistics=pd.DataFrame(list(zip(top_25,median,low_25)),columns=columns)
pd.set_option('plotting.backend', 'plotly')
fig = df_statistics.plot(width=1600, height=800,title=f"Simulation of {NUMBER_OF_SIMULATIONS} portfolios",labels= {"index": "Years to Maturity", "value":"Total Capital"} )
fig.add_trace(go.Scatter(x=list(range(0,YEARS_OF_SIMULATION)),y=np.array(top_25),fill='tonexty',mode='lines', line_color='blue' , fillcolor ="red", showlegend=False, hoverinfo="skip"))
fig.add_trace(go.Scatter(x=list(range(0,YEARS_OF_SIMULATION)),y=np.array(median),fill='tonexty',mode='lines', line_color='orange', fillcolor="green", showlegend=False, hoverinfo="skip"))
[*********************100%%**********************] 1 of 1 completed
0%| | 0/1000 [00:00<?, ?it/s]C:\Users\dadoi\anaconda3\Lib\random.py:374: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]` 100%|██████████| 1000/1000 [03:28<00:00, 4.80it/s]
In [17]:
ls_simulations_at_profit = []
for i in range(YEARS_OF_SIMULATION):
c = len([1 for i in list(df_simulations.iloc[i]) if i > STARTING_CAPITAL])
ls_simulations_at_profit.append(c / NUMBER_OF_SIMULATIONS * 100)
pd.set_option('plotting.backend', 'plotly')
df_simulations_at_profit = pd.DataFrame(ls_simulations_at_profit, columns=["Profit %"])
df_simulations_at_profit.plot(title="Minimum investment horizon",
labels={"index": "Period length in years", "value": "Chance to be in profit"})
In [ ]:
In [18]:
!jupyter nbconvert --execute --to html Portfolio1.ipynb --HTMLExporter.theme=dark
[NbConvertApp] Converting notebook Portfolio1.ipynb to html 0.00s - Debugger warning: It seems that frozen modules are being used, which may 0.00s - make the debugger miss breakpoints. Please pass -Xfrozen_modules=off 0.00s - to python to disable frozen modules. 0.00s - Note: Debugging will proceed. Set PYDEVD_DISABLE_FILE_VALIDATION=1 to disable this validation. 0.00s - Debugger warning: It seems that frozen modules are being used, which may 0.00s - make the debugger miss breakpoints. Please pass -Xfrozen_modules=off 0.00s - to python to disable frozen modules. 0.00s - Note: Debugging will proceed. Set PYDEVD_DISABLE_FILE_VALIDATION=1 to disable this validation. [NbConvertApp] WARNING | Alternative text is missing on 3 image(s). [NbConvertApp] Writing 4936503 bytes to Portfolio1.html
In [ ]: